package com.isorf.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.isorf.mapper.inventorymapper;
import com.isorf.mapper.shoemapper;
import com.isorf.mapper.imagemapper;
import com.isorf.pojo.links;
import com.isorf.pojo.shoe;
import com.isorf.pojo.brand;
import com.isorf.pojo.type;
import com.isorf.pojo.color;
import com.isorf.pojo.size;
import com.isorf.pojo.inventory;
import com.isorf.pojo.image;
import com.isorf.service.shoeservice;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service
public class shoeserviceimpl implements shoeservice {

    @Autowired
    private shoemapper shoemapper;

    @Autowired
    private inventorymapper inventorymapper;
    
    @Autowired
    private imagemapper imagemapper;
    // 1. 分页查询
    @Override
    public PageInfo<shoe> pageList(int pageNum, int pageSize) {
        // 使用PageHelper.startPage方法设置分页参数
        PageHelper.startPage(pageNum, pageSize);
        // 查询所有鞋子数据，此时查询会被自动分页
        List<shoe> shoeList = shoemapper.pageList();
        // 使用PageInfo包装查询结果，便于页面使用
        return new PageInfo<>(shoeList);
    }

    // 2. 根据ID查询
    @Override
    public List<shoe> getShoeById(Integer shoeId) {
        return shoemapper.getShoeById(shoeId);
    }

    // 3. 修改鞋子信息
    @Override
    @Transactional
    public Boolean updateshoe(shoe shoe) {
        try {
            // 0. 外键验证
            if (!validateForeignKeys(shoe)) {
                return false;
            }
            
            // 1. 更新鞋子基本信息
            int shoeResult = shoemapper.updateShoe(shoe);
            if (shoeResult <= 0) {
                return false;
            }
            
            System.out.println("✅ 鞋子基本信息更新成功，鞋子ID: " + shoe.getShoeId());
            
            // 2. 更新品牌信息（如果品牌信息不为空且品牌ID存在）
            if (shoe.getBrand() != null && shoe.getBrand().getBrandid() != null) {
                int brandResult = shoemapper.updateBrand(shoe.getBrand());
                if (brandResult <= 0) {
                    // 品牌更新失败不影响主表更新，只记录日志
                    System.out.println("品牌更新失败，但主表更新成功");
                } else {
                    System.out.println("✅ 品牌信息更新成功");
                }
            }
            
            // 3. 更新类型信息（如果类型信息不为空且类型ID存在）
            if (shoe.getShoeType() != null && shoe.getShoeType().getTypeid() != null) {
                int typeResult = shoemapper.updateType(shoe.getShoeType());
                if (typeResult <= 0) {
                    // 类型更新失败不影响主表更新，只记录日志
                    System.out.println("类型更新失败，但主表更新成功");
                } else {
                    System.out.println("✅ 类型信息更新成功");
                }
            }
            
            // 4. 更新颜色信息（如果颜色信息不为空且颜色ID存在）
            if (shoe.getColor() != null && shoe.getColor().getColorId() != null) {
                int colorResult = shoemapper.updateColor(shoe.getColor());
                if (colorResult <= 0) {
                    // 颜色更新失败不影响主表更新，只记录日志
                    System.out.println("颜色更新失败，但主表更新成功");
                } else {
                    System.out.println("✅ 颜色信息更新成功");
                }
            }
            
            // 5. 更新库存信息（如果库存列表不为空）
            if (shoe.getInventoryList() != null && !shoe.getInventoryList().isEmpty()) {
                try {
                    // 先删除原有库存
                    shoemapper.deleteInventoryByShoeId(shoe.getShoeId());
                    
                    // 插入新的库存信息
                    for (inventory inv : shoe.getInventoryList()) {
                        inv.setShoeId(shoe.getShoeId());
                        int inventoryResult = shoemapper.insertInventory(inv);
                        if (inventoryResult <= 0) {
                            // 库存操作失败不影响主表更新，只记录日志
                            System.out.println("库存更新失败，但主表更新成功");
                        }
                    }
                    System.out.println("✅ 库存信息更新成功，共更新 " + shoe.getInventoryList().size() + " 条库存记录");
                } catch (Exception e) {
                    // 库存表不存在或其他库存相关错误，不影响主表更新
                    System.out.println("库存操作失败: " + e.getMessage() + "，但主表更新成功");
                }
            } else {
                System.out.println("ℹ️ 没有库存信息需要更新");
            }
            
            // 6. 更新图片信息（如果图片列表不为空）
            if (shoe.getImage() != null && !shoe.getImage().isEmpty()) {
                try {
                    System.out.println("🔄 开始更新图片信息:");
                    System.out.println("  鞋子ID: " + shoe.getShoeId());
                    System.out.println("  图片列表大小: " + shoe.getImage().size());
                    
                    // 打印每张图片的信息
                    for (int i = 0; i < shoe.getImage().size(); i++) {
                        image img = shoe.getImage().get(i);
                        System.out.println("  图片" + (i+1) + ": " + img.getImageUrl());
                    }
                    
                    // 先删除原有图片
                    int deleteResult = imagemapper.deleteImagesByShoeId(shoe.getShoeId());
                    System.out.println("🗑️ 删除原有图片 " + deleteResult + " 张");
                    
                    // 插入新的图片信息
                    int imageResult = imagemapper.addImage(shoe.getShoeId(), shoe.getImage());
                    if (imageResult > 0) {
                        System.out.println("✅ 图片信息更新成功，共更新 " + imageResult + " 张图片");
                    } else {
                        System.out.println("❌ 图片信息更新失败，返回结果: " + imageResult);
                    }
                } catch (Exception e) {
                    System.out.println("❌ 图片更新过程中发生异常: " + e.getMessage());
                    e.printStackTrace();
                }
            } else {
                System.out.println("ℹ️ 没有图片信息需要更新");
            }
            
            System.out.println("🎯 鞋子更新操作完成，最终结果: 成功");
            return true;
        } catch (Exception e) {
            System.out.println("❌ 更新鞋子过程中发生异常: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }

    // 4. 修改禁用状态
    @Override
    @Transactional
    public Boolean updateShoeStatus(Integer shoeId, Integer shoeStatus) {
        try {
            int result = shoemapper.updateShoeStatus(shoeId, shoeStatus);
            return result > 0;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

        /**
     * 添加鞋子
     * 在添加鞋子的同时,需要向库中添加库存信息和图片信息
     * @param shoe
     * @return
     */
    @Override
    @Transactional
    public Boolean addshoe(shoe shoe) {
        try {
            // 0. 外键验证
            if (!validateForeignKeys(shoe)) {
                return false;
            }
            
            // 1. 生成鞋子ID（如果未提供）
            if (shoe.getShoeId() == null) {
                // 查询当前最大ID，然后递增
                Integer maxId = shoemapper.getMaxShoeId();
                shoe.setShoeId(maxId + 1);
            }
            
            // 2. 调用ShoeMapper添加鞋子
            int result = shoemapper.insertShoe(shoe);
            if (result <= 0) {
                System.out.println("鞋子基本信息添加失败");
                return false;
            }
            
            System.out.println("✅ 鞋子基本信息添加成功，鞋子ID: " + shoe.getShoeId());
            
            // 3. 调用库存的方法添加库存信息
            boolean inventorySuccess = true;
            if (shoe.getInventoryList() != null && !shoe.getInventoryList().isEmpty()) {
                int inventoryResult = inventorymapper.addInventoryList(shoe.getShoeId(), shoe.getInventoryList());
                if (inventoryResult > 0) {
                    System.out.println("✅ 库存信息添加成功，共添加 " + inventoryResult + " 条库存记录");
                } else {
                    System.out.println("❌ 库存信息添加失败");
                    inventorySuccess = false;
                }
            } else {
                System.out.println("ℹ️ 没有库存信息需要添加");
            }
            
                    // 4. 调用图片的方法添加图片信息
        boolean imageSuccess = true;
        if (shoe.getImage() != null && !shoe.getImage().isEmpty()) {
            System.out.println("🔍 图片添加调试信息:");
            System.out.println("  鞋子ID: " + shoe.getShoeId());
            System.out.println("  图片列表大小: " + shoe.getImage().size());
            
            // 打印每张图片的信息
            for (int i = 0; i < shoe.getImage().size(); i++) {
                image img = shoe.getImage().get(i);
                System.out.println("  图片" + (i+1) + ": " + img.getImageUrl());
            }
            
            try {
                int imageResult = imagemapper.addImage(shoe.getShoeId(), shoe.getImage());
                if (imageResult > 0) {
                    System.out.println("✅ 图片信息添加成功，共添加 " + imageResult + " 张图片");
                } else {
                    System.out.println("❌ 图片信息添加失败，返回结果: " + imageResult);
                    imageSuccess = false;
                }
            } catch (Exception e) {
                System.out.println("❌ 图片添加过程中发生异常: " + e.getMessage());
                e.printStackTrace();
                imageSuccess = false;
            }
        } else {
            System.out.println("ℹ️ 没有图片信息需要添加");
        }
            
            // 5. 返回结果（只要鞋子基本信息添加成功就认为成功）
            boolean finalResult = result > 0;
            System.out.println("🎯 鞋子添加操作完成，最终结果: " + (finalResult ? "成功" : "失败"));
            return finalResult;
            
        } catch (Exception e) {
            System.out.println("❌ 添加鞋子过程中发生异常: " + e.getMessage());
            e.printStackTrace();
            return false;
        }
    }
    
    // 外键验证方法
    private Boolean validateForeignKeys(shoe shoe) {
        try {
            // 验证品牌ID
            if (shoe.getBrand() != null && shoe.getBrand().getBrandid() != null) {
                Integer brandExists = shoemapper.checkBrandExists(shoe.getBrand().getBrandid());
                if (brandExists == 0) {
                    System.out.println("错误：品牌ID " + shoe.getBrand().getBrandid() + " 不存在");
                    return false;
                }
            }
            
            // 验证类型ID
            if (shoe.getShoeType() != null && shoe.getShoeType().getTypeid() != null) {
                Integer typeExists = shoemapper.checkTypeExists(shoe.getShoeType().getTypeid());
                if (typeExists == 0) {
                    System.out.println("错误：类型ID " + shoe.getShoeType().getTypeid() + " 不存在");
                    return false;
                }
            }
            
            // 验证颜色ID
            if (shoe.getColor() != null && shoe.getColor().getColorId() != null) {
                Integer colorExists = shoemapper.checkColorExists(shoe.getColor().getColorId());
                if (colorExists == 0) {
                    System.out.println("错误：颜色ID " + shoe.getColor().getColorId() + " 不存在");
                    return false;
                }
            }
            
            // 验证库存中的尺码ID
            if (shoe.getInventoryList() != null && !shoe.getInventoryList().isEmpty()) {
                for (inventory inv : shoe.getInventoryList()) {
                    if (inv.getSizeId() != null) {
                        Integer sizeExists = shoemapper.checkSizeExists(inv.getSizeId());
                        if (sizeExists == 0) {
                            System.out.println("错误：尺码ID " + inv.getSizeId() + " 不存在");
                            return false;
                        }
                    }
                }
            }
            
            return true;
        } catch (Exception e) {
            System.out.println("外键验证过程中发生错误: " + e.getMessage());
            return false;
        }
    }
}
